feat: retire team workspace rollout flags - #14530
Conversation
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
📄 Knowledge reviewDosu skipped reviewing this PR because your organization has used its |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1778 passed, 0 failed · 2 flaky📊 Browser Reports
📦 Bundle: 8.21 MB gzip 🟢 -1.25 kBDetailsSummary
Category Glance App Entry Points — 3.64 kB (baseline 3.64 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.29 MB (baseline 1.29 MB) • 🟢 -180 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed / 1 unchanged Views & Navigation — 111 kB (baseline 111 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 12 added / 12 removed / 4 unchanged Panels & Settings — 551 kB (baseline 551 kB) • 🟢 -588 BConfiguration panels, inspectors, and settings screens
Status: 12 added / 12 removed / 14 unchanged User & Accounts — 28.7 kB (baseline 28.7 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 7 added / 7 removed / 3 unchanged Editors & Dialogs — 124 kB (baseline 124 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 6 added / 6 removed / 1 unchanged UI Components — 70 kB (baseline 70 kB) • ⚪ 0 BReusable component library chunks
Status: 6 added / 6 removed / 9 unchanged Data & Services — 3.44 MB (baseline 3.45 MB) • 🟢 -5.12 kBStores, services, APIs, and repositories
Status: 14 added / 14 removed / 3 unchanged Utilities & Hooks — 384 kB (baseline 386 kB) • 🟢 -1.12 kBHelpers, composables, and utility bundles
Status: 19 added / 19 removed / 17 unchanged Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 12.8 MB (baseline 12.8 MB) • 🔴 +1.66 kBBundles that do not match a named category
Status: 80 added / 80 removed / 201 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-08-02T04:50:53.791Z",
"gitSha": "2ebd06d237f7e4a580c90d0b835c85a21a32a6de",
"branch": "remove-team-ff",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2104.0820000000053,
"styleRecalcs": 11,
"styleRecalcDurationMs": 9.994000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 499.35,
"heapDeltaBytes": 4745732,
"heapUsedBytes": 71747140,
"domNodes": 22,
"jsHeapTotalBytes": 21360640,
"scriptDurationMs": 17.893000000000004,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-idle",
"durationMs": 2039.5980000000122,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.338000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 487.092,
"heapDeltaBytes": 5259208,
"heapUsedBytes": 73153276,
"domNodes": 20,
"jsHeapTotalBytes": 20312064,
"scriptDurationMs": 15.324000000000002,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1968.9610000000073,
"styleRecalcs": 77,
"styleRecalcDurationMs": 39.614999999999995,
"layouts": 12,
"layoutDurationMs": 3.8680000000000003,
"taskDurationMs": 1018.202,
"heapDeltaBytes": -17263836,
"heapUsedBytes": 50665208,
"domNodes": -282,
"jsHeapTotalBytes": 20963328,
"scriptDurationMs": 138.654,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1892.05400000003,
"styleRecalcs": 74,
"styleRecalcDurationMs": 36.663000000000004,
"layouts": 12,
"layoutDurationMs": 3.379,
"taskDurationMs": 873.0360000000001,
"heapDeltaBytes": -15424280,
"heapUsedBytes": 52521532,
"domNodes": -281,
"jsHeapTotalBytes": 20439040,
"scriptDurationMs": 121.57300000000001,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1723.4020000000214,
"styleRecalcs": 31,
"styleRecalcDurationMs": 15.030999999999999,
"layouts": 6,
"layoutDurationMs": 0.624,
"taskDurationMs": 370.35699999999997,
"heapDeltaBytes": 8007780,
"heapUsedBytes": 75791064,
"domNodes": 77,
"jsHeapTotalBytes": 20574208,
"scriptDurationMs": 18.594,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1738.689999999906,
"styleRecalcs": 33,
"styleRecalcDurationMs": 17.292,
"layouts": 6,
"layoutDurationMs": 0.7079999999999999,
"taskDurationMs": 380.547,
"heapDeltaBytes": 7936200,
"heapUsedBytes": 75712840,
"domNodes": 79,
"jsHeapTotalBytes": 20574208,
"scriptDurationMs": 19.836,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "dom-widget-clipping",
"durationMs": 642.5040000000024,
"styleRecalcs": 12,
"styleRecalcDurationMs": 9.001000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 405.171,
"heapDeltaBytes": -11841184,
"heapUsedBytes": 55851972,
"domNodes": 20,
"jsHeapTotalBytes": 22409216,
"scriptDurationMs": 61.507,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 590.0520000000142,
"styleRecalcs": 11,
"styleRecalcDurationMs": 6.916,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 366.922,
"heapDeltaBytes": -12026360,
"heapUsedBytes": 55856412,
"domNodes": 18,
"jsHeapTotalBytes": 21622784,
"scriptDurationMs": 58.925000000000004,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-idle",
"durationMs": 2028.024999999957,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.467999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 654.7450000000001,
"heapDeltaBytes": 8055776,
"heapUsedBytes": 67740560,
"domNodes": -282,
"jsHeapTotalBytes": 4780032,
"scriptDurationMs": 99.37700000000002,
"eventListeners": -142,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2027.4509999999282,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.788999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 672.0820000000001,
"heapDeltaBytes": 8028860,
"heapUsedBytes": 66723652,
"domNodes": -280,
"jsHeapTotalBytes": 5042176,
"scriptDurationMs": 105.19800000000001,
"eventListeners": -142,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2196.380999999974,
"styleRecalcs": 68,
"styleRecalcDurationMs": 12.799000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1286.8310000000001,
"heapDeltaBytes": 5073912,
"heapUsedBytes": 65844600,
"domNodes": -283,
"jsHeapTotalBytes": 4743168,
"scriptDurationMs": 425.16499999999996,
"eventListeners": -142,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-pan",
"durationMs": 2164.3679999999677,
"styleRecalcs": 69,
"styleRecalcDurationMs": 14.049,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1255.5459999999998,
"heapDeltaBytes": 6017664,
"heapUsedBytes": 65931100,
"domNodes": -283,
"jsHeapTotalBytes": 5267456,
"scriptDurationMs": 430.25800000000004,
"eventListeners": -144,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3198.859000000027,
"styleRecalcs": 64,
"styleRecalcDurationMs": 13.768999999999997,
"layouts": 60,
"layoutDurationMs": 7.0280000000000005,
"taskDurationMs": 1493.326,
"heapDeltaBytes": -1977572,
"heapUsedBytes": 60365724,
"domNodes": -286,
"jsHeapTotalBytes": 7663616,
"scriptDurationMs": 525.945,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3198.020999999926,
"styleRecalcs": 64,
"styleRecalcDurationMs": 13.549000000000001,
"layouts": 60,
"layoutDurationMs": 7.041,
"taskDurationMs": 1500.629,
"heapDeltaBytes": -2008536,
"heapUsedBytes": 60150680,
"domNodes": -289,
"jsHeapTotalBytes": 8187904,
"scriptDurationMs": 529.3829999999999,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2029.9799999999664,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.124000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 671.1020000000001,
"heapDeltaBytes": 7538392,
"heapUsedBytes": 68250036,
"domNodes": -283,
"jsHeapTotalBytes": 4517888,
"scriptDurationMs": 107.571,
"eventListeners": -144,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "minimap-idle",
"durationMs": 2020.750000000021,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.360999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 659.8679999999999,
"heapDeltaBytes": 7857564,
"heapUsedBytes": 68210040,
"domNodes": -283,
"jsHeapTotalBytes": 4517888,
"scriptDurationMs": 103.564,
"eventListeners": -144,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 579.8730000000205,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.897,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 394.284,
"heapDeltaBytes": -10569688,
"heapUsedBytes": 57283956,
"domNodes": 20,
"jsHeapTotalBytes": 21360640,
"scriptDurationMs": 118.35699999999999,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 572.7209999998877,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.752,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 396.764,
"heapDeltaBytes": -10791636,
"heapUsedBytes": 57253620,
"domNodes": 20,
"jsHeapTotalBytes": 20312064,
"scriptDurationMs": 119.892,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 2004.3939999999907,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.652,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 487.05100000000004,
"heapDeltaBytes": -22229688,
"heapUsedBytes": 45742724,
"domNodes": 20,
"jsHeapTotalBytes": 20176896,
"scriptDurationMs": 13.643,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 2044.082000000003,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.514000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 499.439,
"heapDeltaBytes": -21265592,
"heapUsedBytes": 46703152,
"domNodes": -278,
"jsHeapTotalBytes": 20176896,
"scriptDurationMs": 13.325,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1702.0070000000374,
"styleRecalcs": 74,
"styleRecalcDurationMs": 34.596000000000004,
"layouts": 16,
"layoutDurationMs": 4.691000000000001,
"taskDurationMs": 755.5169999999999,
"heapDeltaBytes": -4818456,
"heapUsedBytes": 63191000,
"domNodes": 59,
"jsHeapTotalBytes": 21098496,
"scriptDurationMs": 91.63600000000001,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1696.5230000000702,
"styleRecalcs": 78,
"styleRecalcDurationMs": 34.958000000000006,
"layouts": 16,
"layoutDurationMs": 3.81,
"taskDurationMs": 792.1250000000001,
"heapDeltaBytes": -21248644,
"heapUsedBytes": 46852516,
"domNodes": -278,
"jsHeapTotalBytes": 20439040,
"scriptDurationMs": 90.05799999999999,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-transition-enter",
"durationMs": 1400.8000000000038,
"styleRecalcs": 17,
"styleRecalcDurationMs": 29.594,
"layouts": 13,
"layoutDurationMs": 11.86,
"taskDurationMs": 950.6860000000001,
"heapDeltaBytes": 31063444,
"heapUsedBytes": 99348136,
"domNodes": 13673,
"jsHeapTotalBytes": 14417920,
"scriptDurationMs": 34.590999999999994,
"eventListeners": 2371,
"totalBlockingTimeMs": 129,
"frameDurationMs": 16.666666666666696,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8269.862999999987,
"styleRecalcs": 249,
"styleRecalcDurationMs": 34.512,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4486.624,
"heapDeltaBytes": 14205096,
"heapUsedBytes": 73017012,
"domNodes": -281,
"jsHeapTotalBytes": 7888896,
"scriptDurationMs": 1424.774,
"eventListeners": -128,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8253.570000000082,
"styleRecalcs": 250,
"styleRecalcDurationMs": 35.779,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4414.3460000000005,
"heapDeltaBytes": 10875292,
"heapUsedBytes": 70183860,
"domNodes": -284,
"jsHeapTotalBytes": 7069696,
"scriptDurationMs": 1380.571,
"eventListeners": -128,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 16862.894999999982,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16841.525,
"heapDeltaBytes": -49292536,
"heapUsedBytes": 167143416,
"domNodes": -8312,
"jsHeapTotalBytes": -8593408,
"scriptDurationMs": 581.933,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 18.33666666666662,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 16739.774000000012,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16707.805,
"heapDeltaBytes": -36847968,
"heapUsedBytes": 167018320,
"domNodes": -8312,
"jsHeapTotalBytes": -15933440,
"scriptDurationMs": 565.259,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.77333333333336,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 20147.271999999986,
"styleRecalcs": 137,
"styleRecalcDurationMs": 15.178999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 20090.398,
"heapDeltaBytes": -36688380,
"heapUsedBytes": 164415800,
"domNodes": -8316,
"jsHeapTotalBytes": -16195584,
"scriptDurationMs": 892.898,
"eventListeners": -16381,
"totalBlockingTimeMs": 111,
"frameDurationMs": 17.77333333333336,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 20314.773999999943,
"styleRecalcs": 139,
"styleRecalcDurationMs": 15.819999999999974,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 20278.055,
"heapDeltaBytes": -37589648,
"heapUsedBytes": 180042424,
"domNodes": -8317,
"jsHeapTotalBytes": -13381632,
"scriptDurationMs": 883.9189999999999,
"eventListeners": -16385,
"totalBlockingTimeMs": 124,
"frameDurationMs": 17.779999999999927,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 456.01100000004635,
"styleRecalcs": 15,
"styleRecalcDurationMs": 23.150999999999996,
"layouts": 3,
"layoutDurationMs": 1.2699999999999998,
"taskDurationMs": 121.36099999999998,
"heapDeltaBytes": -15887792,
"heapUsedBytes": 51025468,
"domNodes": 130,
"jsHeapTotalBytes": 7991296,
"scriptDurationMs": 10.061000000000002,
"eventListeners": 67,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 460.40400000003956,
"styleRecalcs": 12,
"styleRecalcDurationMs": 16.288999999999998,
"layouts": 2,
"layoutDurationMs": 0.3129999999999999,
"taskDurationMs": 104.907,
"heapDeltaBytes": -16014796,
"heapUsedBytes": 50972780,
"domNodes": 117,
"jsHeapTotalBytes": 7467008,
"scriptDurationMs": 9.078000000000001,
"eventListeners": 65,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
}
]
} |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughCloud workspace behavior no longer depends on ChangesCloud feature-flag removal
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related issues
Possibly related PRs
Suggested labels: Suggested reviewers: Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 inconclusive)
✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/platform/workspace/auth/WorkspaceAuthGate.vue (1)
82-91: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy liftExpose a retry path for workspace initialization failures.
Authenticated Cloud users remain gated because the catch block leaves
isReadyfalse afterinitializeWorkspaceMode()or config initialization fails. Show a user-facing error with retry instead of leaving the splash screen indefinitely.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/platform/workspace/auth/WorkspaceAuthGate.vue` around lines 82 - 91, Update the workspace initialization error handling in WorkspaceAuthGate, including initializeWorkspaceMode and config initialization, so failures set the gate to a recoverable error state rather than leaving isReady false indefinitely. Display a user-facing error with a retry action that reruns initialization and restores the normal ready flow on success.Source: Coding guidelines
src/platform/settings/composables/useSettingUI.ts (1)
227-233: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winHide empty Workspace navigation groups. When
isCloudis true andisLoggedIn.valueis false,SettingDialog.vuerenders the emptyWorkspacegroup because it does not filternavGroups. Filter groups with no items before rendering.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/platform/settings/composables/useSettingUI.ts` around lines 227 - 233, Update the navigation-group preparation in SettingDialog.vue to remove groups whose items collection is empty before rendering, including the Workspace group when shouldShowWorkspacePanel is false. Preserve existing group and item visibility logic while ensuring navGroups only contains groups with at least one item.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/components/topbar/CurrentUserButton.vue`:
- Around line 52-56: Update the CurrentUserButton popover rendering so Cloud
users still receive usable account-menu content whenever initState is not
'ready', including loading and failed initialization states; alternatively,
disable opening the popover in those states. Preserve the existing ready Cloud
and non-Cloud branches, and add coverage for each non-ready initialization
state.
---
Outside diff comments:
In `@src/platform/settings/composables/useSettingUI.ts`:
- Around line 227-233: Update the navigation-group preparation in
SettingDialog.vue to remove groups whose items collection is empty before
rendering, including the Workspace group when shouldShowWorkspacePanel is false.
Preserve existing group and item visibility logic while ensuring navGroups only
contains groups with at least one item.
In `@src/platform/workspace/auth/WorkspaceAuthGate.vue`:
- Around line 82-91: Update the workspace initialization error handling in
WorkspaceAuthGate, including initializeWorkspaceMode and config initialization,
so failures set the gate to a recoverable error state rather than leaving
isReady false indefinitely. Display a user-facing error with a retry action that
reruns initialization and restores the normal ready flow on success.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: b63008a9-e5a5-40d4-8850-4687a499eeba
📒 Files selected for processing (42)
browser_tests/fixtures/data/cloudWorkspace.tsbrowser_tests/fixtures/helpers/CloudWorkspaceMockHelper.tsbrowser_tests/tests/authAccountSwitch.spec.tsbrowser_tests/tests/billingFacadeConsumers.spec.tsbrowser_tests/tests/currentUserPopoverCredits.spec.tsbrowser_tests/tests/dialogs/creditsTile.spec.tsbrowser_tests/tests/dialogs/pricingTableDeepLink.spec.tsbrowser_tests/tests/workspaceSwitcher.spec.tssrc/components/topbar/CurrentUserButton.test.tssrc/components/topbar/CurrentUserButton.vuesrc/composables/billing/useBillingContext.test.tssrc/composables/billing/useBillingContext.tssrc/composables/billing/useBillingRouting.test.tssrc/composables/billing/useBillingRouting.tssrc/composables/useFeatureFlags.test.tssrc/composables/useFeatureFlags.tssrc/composables/useUrlActionLoaders.test.tssrc/composables/useUrlActionLoaders.tssrc/platform/auth/session/useSessionCookie.test.tssrc/platform/auth/session/useSessionCookie.tssrc/platform/remoteConfig/refreshRemoteConfig.tssrc/platform/remoteConfig/remoteConfig.tssrc/platform/remoteConfig/types.tssrc/platform/settings/composables/useSettingUI.test.tssrc/platform/settings/composables/useSettingUI.tssrc/platform/settings/composables/useSettingsDialog.test.tssrc/platform/settings/composables/useSettingsDialog.tssrc/platform/workspace/auth/WorkspaceAuthGate.test.tssrc/platform/workspace/auth/WorkspaceAuthGate.vuesrc/platform/workspace/components/SubscriptionCheckoutSteps.stories.tssrc/platform/workspace/components/SubscriptionSuccessWorkspace.test.tssrc/platform/workspace/components/SubscriptionSuccessWorkspace.vuesrc/platform/workspace/components/UnifiedPricingTable.stories.tssrc/platform/workspace/components/UnifiedPricingTable.test.tssrc/platform/workspace/components/UnifiedPricingTable.vuesrc/platform/workspace/stores/useWorkspaceAuth.test.tssrc/platform/workspace/stores/workspaceAuthStore.tssrc/stores/__tests__/authTokenPriority.test.tssrc/stores/authStore.test.tssrc/stores/authStore.tssrc/storybook/mocks/useFeatureFlags.tssrc/utils/devFeatureFlagOverride.ts
💤 Files with no reviewable changes (12)
- src/components/topbar/CurrentUserButton.test.ts
- browser_tests/tests/workspaceSwitcher.spec.ts
- src/platform/auth/session/useSessionCookie.test.ts
- src/composables/useFeatureFlags.ts
- src/platform/remoteConfig/types.ts
- src/platform/workspace/components/UnifiedPricingTable.test.ts
- src/stores/authStore.test.ts
- src/platform/workspace/components/SubscriptionSuccessWorkspace.test.ts
- src/composables/useFeatureFlags.test.ts
- src/platform/remoteConfig/refreshRemoteConfig.ts
- browser_tests/tests/dialogs/pricingTableDeepLink.spec.ts
- src/platform/workspace/stores/useWorkspaceAuth.test.ts
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## main #14530 +/- ##
==========================================
- Coverage 78.25% 78.22% -0.03%
==========================================
Files 1767 1769 +2
Lines 109927 110024 +97
Branches 35289 35222 -67
==========================================
+ Hits 86025 86069 +44
- Misses 23353 23401 +48
- Partials 549 554 +5
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 9 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/platform/workspace/auth/WorkspaceAuthGate.test.ts`:
- Around line 352-354: Update the retry test around the “Try again” button in
WorkspaceAuthGate to wait for the asynchronous retry initialization and
resulting Vue reactive updates before asserting slot-content. Use the project’s
documented Vitest reactive-waiting pattern from docs/guidance/vitest.md, while
preserving the existing user.click interaction and slot-content assertion.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 2c77fd6f-511d-436c-a1c5-ba5d35e3802c
📒 Files selected for processing (13)
browser_tests/fixtures/ComfyPage.tsbrowser_tests/fixtures/utils/workspaceMocks.tssrc/components/topbar/CurrentUserButton.test.tssrc/components/topbar/CurrentUserButton.vuesrc/locales/en/main.jsonsrc/platform/settings/composables/useSettingUI.test.tssrc/platform/settings/composables/useSettingUI.tssrc/platform/workspace/auth/WorkspaceAuthGate.test.tssrc/platform/workspace/auth/WorkspaceAuthGate.vuesrc/platform/workspace/components/CurrentUserPopoverWorkspace.test.tssrc/platform/workspace/components/CurrentUserPopoverWorkspace.vuesrc/platform/workspace/stores/teamWorkspaceStore.test.tssrc/platform/workspace/stores/teamWorkspaceStore.ts
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fbba1-3994-7630-a20c-19b9965b4fd2 Co-authored-by: Amp <amp@ampcode.com>
|
note: flagging a duplicate-effort collision rather than commenting on the code here. This PR and the four-PR stack #14612, #14613, #14614, #14615 by @dante01yoon both retire The backend counterpart Comfy-Org/cloud#6040 pins its rollout dependency to this PR specifically, so whichever way this is decided, that line needs updating and the other effort closed. I have raised the same note on cloud#6040 and opened #14738 to track the decision. No action needed from me either way, just making sure the two efforts are visible to each other before one of them merges. |
) ## Summary Part 2/4 of the workspace/billing rollout retirement stack. Removes `team_workspaces_enabled` atomically after the recovery foundation in [Comfy-Org#14612](Comfy-Org#14612). Predecessor: [Comfy-Org#14612](Comfy-Org#14612). Successor: [Comfy-Org#14614](Comfy-Org#14614). ## Root cause Workspace mode was split across a long-lived rollout key in session cookies, token selection, auth restoration, workspace boot, account UI/settings, URL actions, and billing routing. Once Cloud workspace support is the default, keeping both branches creates divergent authentication and billing behavior and makes backend feature-key removal unsafe. ## Changes - Remove the team workspace key from remote-config types, enum/getters/cache/refresh, local override, Storybook, browser payloads, and obsolete flag tests. - Make Cloud workspace auth/session restoration/switch/recovery and workspace UI/loaders unconditional after the authenticated config checkpoint. - Preserve OSS and unloaded-workspace legacy bootstrap behavior. - Preserve `consolidated_billing_enabled` and the intermediate billing matrix, including explicit `legacy_stripe` account operations with unified pricing. - Update Cloud fixtures and affected account, settings, subscription, pricing, and token-flow coverage. ## AS IS Cloud workspace/auth/UI/billing paths can diverge depending on `team_workspaces_enabled`. ## TO BE Cloud workspace mode is the single path after authenticated config loads; OSS and unloaded workspace bootstrap remain legacy. No intended visual change; this is rollout retirement, so no screenshot is required. ## Regression coverage - Auth session cookie, API/WebSocket token priority, workspace restoration/switch/recovery. - Workspace gate, account UI, settings/dialog layout, create/invite loaders, pricing, and subscription success behavior. - Intermediate billing routing for OSS, unloaded Cloud, team, personal consolidated off/on, and `legacy_stripe`. - Cloud browser fixtures omit the retired key. - Exact source/browser scan confirms no `team_workspaces_enabled` or `teamWorkspacesEnabled` references. ## Validation - 14 focused Vitest files: 453 tests passed. - `pnpm typecheck` and `pnpm typecheck:browser` passed via commit hook. - targeted formatting/lint passed via commit hook. - `git diff --check dante/workspace-init-recovery...HEAD` passed. - `pnpm knip --cache` passed via push hook. - Focused Cloud Playwright: billing facade 2 passed; pricing owner flow 1 passed. The member-plan flow timed out during local app boot before assertions; the corrected full Cloud Playwright CI job passed. ## Review focus Review only the atomic team-flag removal and intermediate routing matrix. Canonical billing status and consolidated-flag retirement are intentionally deferred. ## Stack/deployment order 1. [Comfy-Org#14612](Comfy-Org#14612) — recovery foundation 2. **This PR** — retire team workspace rollout flag 3. [Comfy-Org#14614](Comfy-Org#14614) — canonical billing status and legacy rail preservation 4. [Comfy-Org#14615](Comfy-Org#14615) — retire consolidated billing rollout flag Deploy the frontend stack before the backend removes `/api/features` compatibility keys. This is also a drain requirement: age out deployed frontend versions and open tabs that still read either retired key before removing backend compatibility keys. Confirm `team_workspaces_enabled` is at 100% and update `Comfy-Org/cloud#6040` to depend on the selected stack rather than competing PR Comfy-Org#14530 before merge. After backend key removal, reverting this PR is not a behavioral restore because a reinstated read of the missing key resolves to the off branch. --------- Co-authored-by: Dante <6510430+dante01yoon@users.noreply.github.com> Co-authored-by: Amp <amp@ampcode.com>
Part 4/4 of the workspace and billing rollout retirement stack. Predecessor: [#14614](#14614) Successor: none (final stack PR) ## Summary Retires `consolidated_billing_enabled` after canonical billing discovery and explicit rail preservation landed in [#14614](#14614). Loaded Cloud workspaces now use unified pricing, while personal workspaces on `legacy_stripe` retain legacy account operations. ## Root cause The final billing route still depended on a compatibility feature key even after the workspace billing contract and canonical rail status were available. Removing the backend key first would therefore change personal-workspace routing during bootstrap or strand legacy Stripe balance/top-up/management behavior. The frontend needs a deterministic route based on distribution, workspace readiness/type, and the canonical billing rail before backend compatibility keys disappear. ## Changes - Removes the consolidated-billing key from remote-config types, enum/getter, authenticated cache/refresh, local override path, Storybook mocks, and browser payloads. - Routes OSS and unloaded Cloud workspaces through legacy bootstrap. - Routes loaded Cloud team workspaces and personal `unknown`/`stripe` rails through workspace billing. - Preserves legacy account operations for personal `legacy_stripe` while keeping unified pricing for every loaded Cloud workspace. - Keeps the legacy adapter, balance, top-up, management behavior, and meaningful regression coverage. - Re-runs the canonical-status rail regression with both retired feature keys absent from `/api/features`. ## AS IS A loaded Cloud personal workspace still consults `consolidated_billing_enabled` to decide its billing adapter and pricing route. No intended visual change. This is rollout cleanup, so no screenshot is required. ## TO BE Loaded Cloud workspaces use unified pricing without a rollout key. Canonical `billing_rail` determines whether personal account operations remain on `legacy_stripe`; team and migrated/unknown personal workspaces use workspace billing. No intended visual change. The existing legacy rail UI remains available where the canonical status selects it. ## Regression coverage - OSS and unloaded-workspace legacy bootstrap. - Cloud team workspace billing. - Cloud personal unknown/Stripe workspace billing. - Cloud personal `legacy_stripe` legacy account operations plus unified pricing. - Billing-context adapter switching and preserved legacy adapter behavior. - Playwright avatar-popover rail selection with `/api/features` omitting both retired keys, canonical status discovery, legacy balance/credits, and no stale workspace zero balance. - Repository search confirms no consolidated-flag symbol/string remains in `src` or `browser_tests`. ## Validation - `pnpm test:unit src/composables/useFeatureFlags.test.ts src/composables/billing/useBillingRouting.test.ts src/composables/billing/useBillingContext.test.ts src/platform/remoteConfig/refreshRemoteConfig.test.ts` — 83 passed. - `pnpm typecheck` — passed. - `pnpm typecheck:browser` — passed. - Targeted oxfmt/oxlint/ESLint commit checks — passed. - `pnpm knip --cache` pre-push check — passed. - `PLAYWRIGHT_LOCAL=1 PLAYWRIGHT_TEST_URL=http://localhost:5174 pnpm test:browser browser_tests/tests/billingFacadeConsumers.spec.ts -g 'avatar popover'` — 1 passed. - `git diff --check dante/canonical-billing-status...HEAD` — passed. ## Review focus Please review only this PR's removal of the consolidated flag and the final routing matrix. Canonical endpoint migration and pending-checkout stabilization belong to [#14614](#14614); workspace-flag retirement belongs to [#14613](#14613). ## Stack/deployment order 1. [#14612](#14612) — workspace initialization recovery 2. [#14613](#14613) — retire team workspace rollout flag 3. [#14614](#14614) — canonical billing status and legacy rail preservation 4. [#14615](#14615) — this PR; retire consolidated billing rollout flag Deploy the frontend stack in this order before the backend removes the `/api/features` compatibility keys. Each branch remains independently deployable; do not deploy a later PR without its predecessor. This is also a drain requirement: age out deployed frontend versions and open tabs that still read either retired key before removing backend compatibility keys. Confirm `consolidated_billing_enabled` is at 100% and update `Comfy-Org/cloud#6040` to depend on this selected stack rather than competing PR #14530 before merge. After backend key removal, reverting this PR is not a behavioral restore because a reinstated read of the missing key resolves to the off branch. Co-authored-by: Connor Byrne <c.byrne@comfy.org>
christian-byrne
left a comment
There was a problem hiding this comment.
Going to close this as it's a duplicate effort with ongoing work that is already partially merged. Please re-open and flag if that's not correct, thakn you.
Summary
Permanently enable team workspaces and consolidated workspace billing in the frontend now that both rollouts are complete.
Changes
team_workspaces_enabledandconsolidated_billing_enabledfrom remote config, feature-flag consumers, cached overrides, mocks, stories, and tests. Cloud workspace auth and workspace billing are now the direct paths; personal workspaces explicitly markedlegacy_striperetain legacy account billing and top-ups.true, but retaining conditional branches left startup/auth races, stale false defaults, and two nominal billing modes around a rollout that had already completed.Review Focus
legacy_stripepersonal workspaces still use legacy status, balance, management, and top-up paths while checkout uses unified pricing./api/features.Testing
pnpm typecheckpnpm typecheck:browserpnpm lint:unstagedbillingFacadeConsumers.spec.tscloud project (both cases; legacy case rerun after strengthening)Screenshots
AS IS / TO BE: no visual change. Both flags were already terminally enabled in production; this removes dead rollout branches while preserving the current Cloud UI.